from rest_framework.generics import ListAPIView, ListCreateAPIView
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response

from meiduo_admin import my_serializers
from users.models import User


class UserPageNum(PageNumberPagination):
    """
    定义用户列表的分页器
    """
    # 指定每页显示数量
    page_size = 5
    page_size_query_description = 'pagesize'
    max_page_size = 10

    # 重写分页返回的方法，按照指定的字段进行分页数据的返回
    def get_paginated_response(self, data):

        return Response({
            'count': self.page.paginator.count,  # 总数量
            'lists': data,  # 用户的数据
            'page': self.page.number,  # 当前页数
            'pages': self.page.paginator.num_pages,  # 总页数
            'pagesize': self.page_size  # 后端指定页容量
        })


class UserView(ListCreateAPIView):  # ListCreateAPIView封装了两个方法get和post，
    """
    展示后台用户列表,ListAPIView已经封装了get方法
    ListCreateAPIView:封装的get和post,get 可以查询数据， post 一般用在表单登录
    """
    # 指定查询集
    queryset = User.objects.all()

    # 指定序列化器
    # serializer_class = my_serializers.UserSerializer
    # 一层一层追加到父类generics的序列化器的代码中找是否有此类代码
    def get_serializer_class(self):
        # 判断请求方式GET,获取用户数据返回UserSerializer序列化器
        if self.request.method == 'GET':
            return my_serializers.UserSerializer
        else:
            # POST请求，完成保存用户，返回UserAddSerializer序列化器
            return my_serializers.UserAddSerializer

    # 指定分页器
    pagination_class = UserPageNum

    # 重写获取查询数据集数据的方法，可以追溯代码找到
    def get_queryset(self):
        keyword = self.request.query_params.get('keyword')
        if keyword is '' or keyword is None:
            return User.objects.all()
        else:
            return User.objects.filter(username__contains=keyword)  # 2下划线contains是模糊查询


